// Express框架中文封装
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const session = require('express-session');

/**
 * 创建一个新的Express应用实例
 * @returns {Object} Express应用实例
 */
function 创建应用() {
  return express();
}

/**
 * 处理GET请求
 * @param {Object} 应用 - Express应用实例
 * @param {string} 路径 - 路由路径
 * @param {...Function} 处理函数 - 请求处理函数
 */
function 监听GET请求(应用, 路径, ...处理函数) {
  应用.get(路径, ...处理函数);
}

/**
 * 处理POST请求
 * @param {Object} 应用 - Express应用实例
 * @param {string} 路径 - 路由路径
 * @param {...Function} 处理函数 - 请求处理函数
 */
function 监听POST请求(应用, 路径, ...处理函数) {
  应用.post(路径, ...处理函数);
}

/**
 * 处理PUT请求
 * @param {Object} 应用 - Express应用实例
 * @param {string} 路径 - 路由路径
 * @param {...Function} 处理函数 - 请求处理函数
 */
function 监听PUT请求(应用, 路径, ...处理函数) {
  应用.put(路径, ...处理函数);
}

/**
 * 处理DELETE请求
 * @param {Object} 应用 - Express应用实例
 * @param {string} 路径 - 路由路径
 * @param {...Function} 处理函数 - 请求处理函数
 */
function 监听DELETE请求(应用, 路径, ...处理函数) {
  应用.delete(路径, ...处理函数);
}

/**
 * 处理所有HTTP方法的请求
 * @param {Object} 应用 - Express应用实例
 * @param {string} 路径 - 路由路径
 * @param {...Function} 处理函数 - 请求处理函数
 */
function 监听所有请求(应用, 路径, ...处理函数) {
  应用.all(路径, ...处理函数);
}

/**
 * 使用中间件
 * @param {Object} 应用 - Express应用实例
 * @param {...Function|string} 中间件 - 中间件函数或路径
 */
function 使用中间件(应用, ...中间件) {
  应用.use(...中间件);
}

/**
 * 静态文件服务
 * @param {Object} 应用 - Express应用实例
 * @param {string} 路径 - 访问路径
 * @param {string} 静态目录 - 静态文件目录
 */
function 静态文件服务(应用, 路径, 静态目录) {
  应用.use(路径, express.static(静态目录));
}

/**
 * 创建路由器
 * @returns {Object} 路由器实例
 */
function 创建路由器() {
  return express.Router();
}

/**
 * 监听指定端口启动服务器
 * @param {Object} 应用 - Express应用实例
 * @param {number|string} 端口 - 服务器端口
 * @param {Function} 回调函数 - 启动成功回调
 */
function 启动服务器(应用, 端口, 回调函数) {
  return 应用.listen(端口, 回调函数);
}

/**
 * 解析JSON请求体
 * @param {Object} 应用 - Express应用实例
 * @param {Object} 选项 - 解析选项
 */
function 解析JSON(应用, 选项) {
  应用.use(express.json(选项));
}

/**
 * 解析URL编码请求体
 * @param {Object} 应用 - Express应用实例
 * @param {Object} 选项 - 解析选项
 */
function 解析URL编码(应用, 选项) {
  应用.use(express.urlencoded(选项));
}

/**
 * 模板引擎设置
 * @param {Object} 应用 - Express应用实例
 * @param {string} 引擎名称 - 模板引擎名称
 * @param {Function} 渲染函数 - 渲染函数
 */
function 设置模板引擎(应用, 引擎名称, 渲染函数) {
  应用.engine(引擎名称, 渲染函数);
}

/**
 * 设置视图引擎
 * @param {Object} 应用 - Express应用实例
 * @param {string} 引擎名称 - 视图引擎名称
 */
function 设置视图引擎(应用, 引擎名称) {
  应用.set('view engine', 引擎名称);
}

/**
 * 设置视图目录
 * @param {Object} 应用 - Express应用实例
 * @param {string} 目录路径 - 视图目录路径
 */
function 设置视图目录(应用, 目录路径) {
  应用.set('views', 目录路径);
}

/**
 * 渲染视图
 * @param {Object} 响应对象 - Express响应对象
 * @param {string} 视图名称 - 视图文件名称
 * @param {Object} 数据 - 传递给视图的数据
 * @param {Function} 回调函数 - 渲染完成回调
 */
function 渲染视图(响应对象, 视图名称, 数据, 回调函数) {
  响应对象.render(视图名称, 数据, 回调函数);
}

/**
 * 发送JSON响应
 * @param {Object} 响应对象 - Express响应对象
 * @param {*} 数据 - 要发送的数据
 */
function 发送JSON(响应对象, 数据) {
  响应对象.json(数据);
}

/**
 * 发送文本响应
 * @param {Object} 响应对象 - Express响应对象
 * @param {string} 文本 - 要发送的文本
 */
function 发送文本(响应对象, 文本) {
  响应对象.send(文本);
}

/**
 * 发送文件响应
 * @param {Object} 响应对象 - Express响应对象
 * @param {string} 文件路径 - 文件路径
 * @param {Object} 选项 - 发送选项
 * @param {Function} 回调函数 - 发送完成回调
 */
function 发送文件(响应对象, 文件路径, 选项, 回调函数) {
  响应对象.sendFile(文件路径, 选项, 回调函数);
}

/**
 * 设置HTTP状态码
 * @param {Object} 响应对象 - Express响应对象
 * @param {number} 状态码 - HTTP状态码
 * @returns {Object} 响应对象
 */
function 设置状态码(响应对象, 状态码) {
  return 响应对象.status(状态码);
}

/**
 * 重定向请求
 * @param {Object} 响应对象 - Express响应对象
 * @param {string|number} 状态码 - HTTP状态码或目标URL
 * @param {string} url - 目标URL（当第一个参数是状态码时）
 */
function 重定向(响应对象, 状态码, url) {
  if (url) {
    响应对象.redirect(状态码, url);
  } else {
    响应对象.redirect(状态码);
  }
}

/**
 * 设置响应头
 * @param {Object} 响应对象 - Express响应对象
 * @param {string} 名称 - 头信息名称
 * @param {string} 值 - 头信息值
 */
function 设置响应头(响应对象, 名称, 值) {
  响应对象.set(名称, 值);
}

/**
 * 获取请求参数
 * @param {Object} 请求对象 - Express请求对象
 * @param {string} 参数名 - 参数名称
 * @returns {string|Object} 参数值
 */
function 获取请求参数(请求对象, 参数名) {
  return 请求对象.params[参数名];
}

/**
 * 获取查询参数
 * @param {Object} 请求对象 - Express请求对象
 * @param {string} 参数名 - 参数名称
 * @returns {string} 参数值
 */
function 获取查询参数(请求对象, 参数名) {
  return 请求对象.query[参数名];
}

/**
 * 获取请求体数据
 * @param {Object} 请求对象 - Express请求对象
 * @param {string} 字段名 - 字段名称
 * @returns {*} 字段值
 */
function 获取请求体(请求对象, 字段名) {
  if (字段名) {
    return 请求对象.body[字段名];
  }
  return 请求对象.body;
}

/**
 * 获取请求头
 * @param {Object} 请求对象 - Express请求对象
 * @param {string} 头名称 - 头信息名称
 * @returns {string} 头信息值
 */
function 获取请求头(请求对象, 头名称) {
  return 请求对象.get(头名称);
}

/**
 * 创建错误处理中间件
 * @param {Object} 应用 - Express应用实例
 * @param {Function} 错误处理函数 - (错误, 请求, 响应, 下一个) => {}
 */
function 错误处理中间件(应用, 错误处理函数) {
  应用.use(错误处理函数);
}

/**
 * 配置Cookie解析中间件
 * @param {Object} 应用 - Express应用实例
 * @param {string} 密钥 - 用于签名cookie的密钥
 * @param {Object} 选项 - 额外的选项
 */
function 配置Cookie解析器(应用, 密钥, 选项) {
  应用.use(cookieParser(密钥, 选项));
}

/**
 * 设置Cookie
 * @param {Object} 响应对象 - Express响应对象
 * @param {string} 名称 - Cookie名称
 * @param {string} 值 - Cookie值
 * @param {Object} 选项 - Cookie选项
 */
function 设置Cookie(响应对象, 名称, 值, 选项) {
  响应对象.cookie(名称, 值, 选项);
}

/**
 * 获取Cookie
 * @param {Object} 请求对象 - Express请求对象
 * @param {string} 名称 - Cookie名称
 * @returns {string} Cookie值
 */
function 获取Cookie(请求对象, 名称) {
  return 请求对象.cookies[名称];
}

/**
 * 获取已签名的Cookie
 * @param {Object} 请求对象 - Express请求对象
 * @param {string} 名称 - Cookie名称
 * @returns {string} 已签名的Cookie值
 */
function 获取签名Cookie(请求对象, 名称) {
  return 请求对象.signedCookies[名称];
}

/**
 * 清除Cookie
 * @param {Object} 响应对象 - Express响应对象
 * @param {string} 名称 - Cookie名称
 * @param {Object} 选项 - 清除选项
 */
function 清除Cookie(响应对象, 名称, 选项) {
  响应对象.clearCookie(名称, 选项);
}

/**
 * 配置Session中间件
 * @param {Object} 应用 - Express应用实例
 * @param {Object} 选项 - Session配置选项
 */
function 配置Session(应用, 选项) {
  应用.use(session(选项));
}

/**
 * 设置Session数据
 * @param {Object} 请求对象 - Express请求对象
 * @param {string} 键 - Session键名
 * @param {*} 值 - Session值
 */
function 设置Session数据(请求对象, 键, 值) {
  请求对象.session[键] = 值;
}

/**
 * 获取Session数据
 * @param {Object} 请求对象 - Express请求对象
 * @param {string} 键 - Session键名
 * @returns {*} Session值
 */
function 获取Session数据(请求对象, 键) {
  return 请求对象.session[键];
}

/**
 * 销毁Session
 * @param {Object} 请求对象 - Express请求对象
 * @param {Function} 回调函数 - 销毁完成回调
 */
function 销毁Session(请求对象, 回调函数) {
  请求对象.session.destroy(回调函数);
}

/**
 * 重新生成Session ID
 * @param {Object} 请求对象 - Express请求对象
 * @param {Function} 回调函数 - 重新生成完成回调
 */
function 重新生成Session(请求对象, 回调函数) {
  请求对象.session.regenerate(回调函数);
}

/**
 * 保存Session
 * @param {Object} 请求对象 - Express请求对象
 * @param {Function} 回调函数 - 保存完成回调
 */
function 保存Session(请求对象, 回调函数) {
  请求对象.session.save(回调函数);
}

/**
 * 触摸Session（更新过期时间）
 * @param {Object} 请求对象 - Express请求对象
 */
function 触摸Session(请求对象) {
  请求对象.session.touch();
}

/**
 * 获取Express原始模块
 * @returns {Object} Express原始模块
 */
function 获取原始Express() {
  return express;
}

module.exports = {
  创建应用,
  监听GET请求,
  监听POST请求,
  监听PUT请求,
  监听DELETE请求,
  监听所有请求,
  使用中间件,
  静态文件服务,
  创建路由器,
  启动服务器,
  解析JSON,
  解析URL编码,
  设置模板引擎,
  设置视图引擎,
  设置视图目录,
  渲染视图,
  发送JSON,
  发送文本,
  发送文件,
  设置状态码,
  重定向,
  设置响应头,
  获取请求参数,
  获取查询参数,
  获取请求体,
  获取请求头,
  错误处理中间件,
  获取原始Express,
  
  // Cookie相关功能
  配置Cookie解析器,
  设置Cookie,
  获取Cookie,
  获取签名Cookie,
  清除Cookie,
  
  // Session相关功能
  配置Session,
  设置Session数据,
  获取Session数据,
  销毁Session,
  重新生成Session,
  保存Session,
  触摸Session
};